// 输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
// 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
// 输出：[1,2,3,6,9,8,7,4,5]

#include<bits/stdc++.h>
using namespace std;

// 模拟/规律

// 执行用时：
// 8 ms
// , 在所有 C++ 提交中击败了
// 89.94%
// 的用户
// 内存消耗：
// 9.7 MB
// , 在所有 C++ 提交中击败了
// 39.07%
// 的用户



class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        // 上下界
        int up=0,down=matrix.size()-1;
        if(down<0){
            return res;
        }
        // 左右界
        int left=0,right=matrix[0].size()-1;
        while(true){
            if(left<=right && up<=down){
                for(int i=left;i<=right;++i){
                    res.emplace_back(matrix[up][i]);
                }
                ++up;
                if(left<=right && up<=down){
                    for(int i=up;i<=down;++i){
                        res.emplace_back(matrix[i][right]);
                    }
                }
                else{
                    break;
                }
                --right;
                if(left<=right && up<=down){
                    for(int i=right;i>=left;--i){
                        res.emplace_back(matrix[down][i]);
                    }
                }
                else{
                    break;
                }

                --down;
                if(left<=right && up<=down){
                    for(int i=down;i>=up;--i){
                        res.emplace_back(matrix[i][left]);
                    }
                }
                else{
                    break;
                }

                ++left;
            }
            else{
                break;
            }
        }
        return res;
    }
};